<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 结论 闭包可以保证 外部作用域 每次访问函数内部的 数据都是同一个数据；
        // 弊端： 闭包内部的数据 会被长期持有不会释放，除非当前执行文件关闭

        function fn(name) {
            console.log(name);
        }

        // 
        fn(123);
        fn('字符串');
        fn(true);
        fn([1, 2, 3, 4, 5]);

        fn({ name: '刘德华' });

        // 函数是 复杂数据类型 函数也属于对象
        fn(function () { })

        var fun = function () { }

        fn(fun);


        // 函数 可以作为 对象的 属性值（称之为 对象的方法）
        var o = {
            sayHi: function () {
                console.log('hell');
            }
        }


        // 闭包： 是为了是外部作用域 能够访问 内部作用域的 方式
        // return： 没办法满足每次访问函数内部的数据都是 同一个
        function foo() {
            var a = 10;
            var b = Math.random();
            return b;
        }

        var num = foo();
        console.log(num);

        var num1 = foo();
        console.log(num1);



        // 闭包的基本格式
        function foo1() {
            var a = 10;
            var b = Math.random();

            return function fn1() {
                return b;
            }
            // return fn1;
        }
        // foo1()();

        var numberFn = foo1(); // 执行一次 

        var number1 = numberFn();
        var number2 = numberFn();

        console.log(number1);
        console.log(number2);

    </script>
</body>

</html>